iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0

上篇我們講解了如何使用 Kotlin 來寫 XML parser ,我們也有提到 DOM parser 有個缺點就是有可能會消耗較多的記憶體,這點在 mobile 平台其實要特別注意,尤其是 Android 系統,Android 的裝置很多,我們沒辦法保證手機的記憶體一定很大。在寫 Android APP 的時候,希望能夠盡可能地省記憶體。那之前介紹的 DOM parser 在 Android 上不見得是很好的做法,幸運的是 Android 原生有提供優化過的 XML parser ,我們可以拿這個來當成我們日後 annotation processor 的 parser generator 的基底。

XmlPullParser

這個 parser 其實並不存在 Java 的 standard library ,他是一個 Android 額外納入的 library ,但他的運作原理其實跟 StAX 一樣。

  • Event pulling based 機制。
  • 以 steam 資料流方式載入資料,讀到哪,寫到哪,依賴節點走訪的先後順序。
  • 與 DOM parser 相比,較省記憶體。
  • 經過實測在 runtime 的時候真的比 DOM parser 快。

XmlPullParser 雖說比較快,也比較省記憶體,但還是有一個缺點:無法直接跨層存取 tag ,必須要一層一層讀取。這個對我們在寫 parser 的時候,或許會比較不方便,我們可以用暫存的變數先把一層層的參數存起來解決無法跨層存取的問題。

XmlPullParser 在拉 event 的時候是靠 next() 這個方法去達成的,有點像是我們在寫 List 的 iterator ,迴圈每次去問還有沒有下個 element 可以用。在這個 parser 裡面有預先定義好一些 event 可以讓我們使用:

  • START_DOCUMENT
    • 代表 XML 內容開始的 event 。
  • START_TAG
    • 這個 event 代表一個 tag 的起始 。
  • TEXT
    • 代表文字內容的 event 。
  • END_TAG
    • 這個 event 代表一個 tag 的結束。
  • END_DOCUMENT
    • 代表 XML 內容結束的 event 。

下篇我們將會開始實作 XmlPullParser ,我們可以比較一下它寫起來的感覺和 DOM parser 有什麼差別!


上一篇
使用 DOM Parser 取屬性
下一篇
使用 XmlPullParser (一)
系列文
如何使用 Kotlin Annotation Processor 做出自己的 Custom Data Parser Library30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言